//#include<stdio.h>
//int main()
//{
//    printf("hello world\n");
//    return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//#include <unistd.h>
//
//void show()
//{
//    printf("hello world"); 
//    _exit(1);
//}
//
//int main()
//{
//    show();
//    return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//#include <unistd.h>
//
//int main() 
//{
//    // 进程创建
//    int id = fork();
//    if(id == -1) 
//    {
//        printf("fork error\n");
//        exit(-1);
//    } 
//    
//    // 子进程
//    else if(id == 0)
//    {  
//        int cnt = 5;
//        while(cnt--) 
//        {
//            printf("子进程, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
//            sleep(1);
//        }
//        exit(1);
//    } 
//    
//    // 父进程
//    else 
//    {  
//        sleep(10);
//        int status = 0;
//        pid_t ret = waitpid(id, &status, 0);  //阻塞等待
//        if(ret == -1) 
//        {
//            printf("wait fail\n");
//            exit(1);
//        } 
//        else 
//        {
//            printf("wait success\n");
//        }
//        printf("exit signal:%d,  exit code:%d\n", (status & 0x7f), (status >> 8 & 0xff));
//    }
//    return 0;
//}


//#include<stdio.h>
//#include<unistd.h>
//
//int main()
//{
//    // ... 前半部分代码 ...
//	printf("Before program replacement...\n");
//
//	execl("/bin/ls", "ls", "-l", "-a", NULL); // 尝试执行ls命令
//
//	// ... 后半部分代码 ...
//	printf("After program replacement...\n"); 
//    
//    return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//
//int main() 
//{
//    pid_t id = fork();
//    
//    // 进程创建失败
//    if(id == -1) 
//    {
//        perror("fork");
//        return 1;
//    } 
//    
//    // 子进程
//    else if (id == 0) 
//    {  
//        printf("pid: %d, 子进程开始运行...\n", getpid());
//        
//        //进程程序替换
//        int ret = execl("/usr/bin/ls", "ls", "-l", "-a", "--color=auto", NULL);
//        
//        // 替换失败，以下语句可以被执行
//        if(ret == -1) 
//        {  
//            printf("process exec failed\n");
//            exit(1);
//        }
//        printf("pid: %d, 子进程结束...\n", getpid());
//        return 0;
//    }
//
//    // 父进程
//    int status = 0;
//    pid_t ret = waitpid(id, &status, 0);  // 进程等待
//    if(ret == -1) 
//    {
//        perror("waitpid");
//        return 1;
//    } 
//    else 
//    {
//        printf("wait pid: %d, exit signal: %d, exit code: %d\n", ret, (status & 0x7f), (status >> 8 & 0xFF));
//    }
//    return 0;
//}

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() 
{
    pid_t id = fork();
    
    // 创建进程
    if(id == -1) 
    {
        perror("fork");
        return 1;
    } 
    
    // 子进程
    else if (id == 0) 
    {  
        printf("pid: %d, 子进程开始运行...\n", getpid());
        
        // 自定义环境变量 
        char* const envp[] = {  
            (char*)"MYENV=HELLO EXEC",
            NULL
        };

        extern char** environ;  						//系统环境变量
        int put = putenv((char*)"MYENV=HELLO_EXECLE");  //导入自定义环境变量
        if(put != 0)  									//导入失败返回非0
            perror("putenv");

        int ret = execle("./bin", "./bin", NULL, environ); //传递环境变量

        // 替换失败，以下语句可以被执行
        if(ret == -1) 
        {  
            printf("process exec failed\n");
            exit(1);
        }
        printf("pid: %d, 子进程结束...\n", getpid());
        return 0;
    }

    // 父进程
    int status = 0;
    pid_t ret = waitpid(id, &status, 0);  // 进程等待
    if(ret == -1) 
    {
        perror("waitpid");
        return 1;
    }
    else 
    {
        printf("wait pid: %d, exit signal: %d, exit code: %d\n", ret, (status & 0x7f), (status >> 8 & 0xFF));
    }
    return 0;
}
